const net = require('net')

// 创建服务端实例
const server = net.createServer()

const PORT = 1234
const HOST = 'localhost'
server.listen(PORT, HOST)

server.on('listening', () => {
  console.log(`服务端已经开启在 http://${HOST}:${PORT}`)
})

// connection: 新的连接建立时触发
// 接收消息, 回写消息. socket: 双工流
server.on('connection', (socket) => {
  // 当接收到数据时触发该事件:
  // 监听 data 事件: 接收客户端发送的数据
  socket.on('data', (chunk) => {
    const msg = chunk.toString()
    console.info('【S】', msg)

    // 给客户端回数据
    socket.write(Buffer.from('Hello ' + msg))
  })
})

server.on('close', () => {
  console.info('服务端关闭了')
})

server.on('error', (err) => {
  if (err.code === 'EADDRINUSE') {
    console.info('地址正在被使用')
  } else {
    console.info(err)
  }
})

/**
- `listening`事件: 调用 `server.listen`方法之后触发
- `connection`事件: 新的连接建立时触发
- `close`事件: 当 `server`关闭时触发
- `error`事件: 当错误出现的时候触发

- `data`事件: 当接收到数据时触发该事件
- `write`事件: 在`socket`上发送数据, 默认是`UTF-8`编码
- `end`操作: 当 `socket`的一端发送 `FIN`包时触发,结束可读端
 */
